/*
   minibz2
      libbz2.dll test program.
      by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
      This file is Public Domain.  Welcome any email to me.

   usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
*/

#define BZ_IMPORT

#include <stdio.h>
#include <stdlib.h>

#ifdef _WIN32
#include <io.h>
#endif


#ifdef _WIN32

#define BZ2_LIBNAME "libbz2-1.0.2.DLL"

#include <windows.h>
static int BZ2DLLLoaded = 0;
static HINSTANCE BZ2DLLhLib;
int BZ2DLLLoadLibrary(void)
{
   HINSTANCE hLib;

   if(BZ2DLLLoaded==1){return 0;}
   hLib=LoadLibrary(BZ2_LIBNAME);
   if(hLib == NULL){
      fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
      return -1;
   }
   BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
   BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
   BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
   BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
   BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
   BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
   BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
   BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");

   if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
       || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
       || !BZ2_bzclose || !BZ2_bzerror) {
      fprintf(stderr,"GetProcAddress failed.\n");
      return -1;
   }
   BZ2DLLLoaded=1;
   BZ2DLLhLib=hLib;
   return 0;

}
int BZ2DLLFreeLibrary(void)
{
   if(BZ2DLLLoaded==0){return 0;}
   FreeLibrary(BZ2DLLhLib);
   BZ2DLLLoaded=0;
}
#endif /* WIN32 */

void usage(void) {
    puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
}

//int main(int argc,char *argv[])
//{
//   int decompress = 0;
//   int level = 9;
//   char *fn_r = NULL;
//   char *fn_w = NULL;
//
//#ifdef _WIN32
//   if(BZ2DLLLoadLibrary()<0){
//      fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME);
//      exit(1);
//   }
//   printf("Loading of %s succeeded.  Library version is %s.\n",
//          BZ2_LIBNAME, BZ2_bzlibVersion() );
//#endif
//   while(++argv,--argc){
//      if(**argv =='-' || **argv=='/'){
//         char *p;
//
//         for(p=*argv+1;*p;p++){
//            if(*p=='d'){
//               decompress = 1;
//            }else if('1'<=*p && *p<='9'){
//               level = *p - '0';
//            }else{
//               usage();
//               exit(1);
//            }
//         }
//      }else{
//         break;
//      }
//   }
//   if(argc>=1){
//      fn_r = *argv;
//      argc--;argv++;
//   }else{
//      fn_r = NULL;
//   }
//   if(argc>=1){
//      fn_w = *argv;
//      argc--;argv++;
//   }else{
//      fn_w = NULL;
//   }
//   {
//      int len;
//      char buff[0x1000];
//      char mode[10];
//
//      if(decompress){
//         BZFILE *BZ2fp_r = NULL;
//         FILE *fp_w = NULL;
//
//         if(fn_w){
//            if((fp_w = fopen(fn_w,"wb"))==NULL){
//               printf("can't open [%s]\n",fn_w);
//               perror("reason:");
//               exit(1);
//            }
//         }else{
//            fp_w = stdout;
//         }
//         if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
//            || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
//            printf("can't bz2openstream\n");
//            exit(1);
//         }
//         while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
//            fwrite(buff,1,len,fp_w);
//         }
//         BZ2_bzclose(BZ2fp_r);
//         if(fp_w != stdout) fclose(fp_w);
//      }else{
//         BZFILE *BZ2fp_w = NULL;
//         FILE *fp_r = NULL;
//
//         if(fn_r){
//            if((fp_r = fopen(fn_r,"rb"))==NULL){
//               printf("can't open [%s]\n",fn_r);
//               perror("reason:");
//               exit(1);
//            }
//         }else{
//            fp_r = stdin;
//         }
//         mode[0]='w';
//         mode[1] = '0' + level;
//         mode[2] = '\0';
//
//         if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
//            || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
//            printf("can't bz2openstream\n");
//            exit(1);
//         }
//         while((len=fread(buff,1,0x1000,fp_r))>0){
//            BZ2_bzwrite(BZ2fp_w,buff,len);
//         }
//         BZ2_bzclose(BZ2fp_w);
//         if(fp_r!=stdin)fclose(fp_r);
//      }
//   }
//#ifdef _WIN32
//   BZ2DLLFreeLibrary();
//#endif
//   return 0;
//}
